package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;

import com.sisgesbyte.common.ConstProyeccion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.proyeccion.MantProyeccionGeneralService;
import com.sisgesbyte.services.proyeccion.MantProyeccionMontoPeriodoService;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionGeneralResponse;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionPeriodoResponse;
import com.sisgesbyte.services.proyeccion.bean.ProyeccionPeriodoBean;

@ManagedBean
@ViewScoped
public class MantProyeccionMontoPeriodoMBean implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@EJB
	private MantProyeccionMontoPeriodoService mantProyeccionMontoPeriodoService;
	@EJB
	private MantProyeccionGeneralService mantProyeccionGeneralService;
	private List<ProyeccionPeriodoBean> listaProyeccionPeriodo;
	private ProyeccionPeriodoBean selectedProyeccionMontoPeriodo;
	private Boolean activarControl;
	private String saved; 
	private String tipoMantenimiento;
	private String montoTotal;
	private String colorProyeccionAsignado;
	
	@PostConstruct
	private void init() {
		
		inicializar();
	}
	
	public void inicializar() {
		try{
			setSaved("");
			montoTotal="";
			tipoMantenimiento = "";
			saved = "";
			selectedProyeccionMontoPeriodo = new ProyeccionPeriodoBean();
			setActivarControl(false);
			BigDecimal totalM =  BigDecimal.ZERO;
			BigDecimal totalGeneral =  BigDecimal.ZERO;
			//obtenemos el Monto total de la Proyeccion General
			try{
				ListaProyeccionGeneralResponse listaGeneral =mantProyeccionGeneralService.mostrarProyeccionGeneral(ObtenerIdTransaccion(), "");
				if(listaGeneral.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
					totalGeneral = listaGeneral.getMontoTotalProyeccion();
				}
			}catch(Exception e){
				totalGeneral =  BigDecimal.ZERO;
			}
			
			
			ListaProyeccionPeriodoResponse response = mantProyeccionMontoPeriodoService.listaProyeccionMontoPeriodos(ObtenerIdTransaccion());
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaProyeccionPeriodo = response.getListaProyeccionPeriodo();
				
				for(ProyeccionPeriodoBean ls : listaProyeccionPeriodo){
					totalM = totalM.add(ls.getMontoProyectado());
				}
			    int val = totalM.compareTo(totalGeneral);
			    
			    if( val == 0 ){
			    	colorProyeccionAsignado = ConstProyeccion.COLOR_VERDE;
			    }else if( val == 1 ){
			    	colorProyeccionAsignado = ConstProyeccion.COLOR_ROJO;
			    }
			    else if( val == -1 ){
			    	colorProyeccionAsignado = ConstProyeccion.COLOR_AMARILLO;
			    };
			    
				DecimalFormatSymbols simbolo=new DecimalFormatSymbols();
			    simbolo.setDecimalSeparator('.');
			    simbolo.setGroupingSeparator(',');
			    DecimalFormat formateador = new DecimalFormat("###,###.##",simbolo);
			    montoTotal = formateador.format(totalM.setScale(3, BigDecimal.ROUND_HALF_UP));
				
			}else{
				this.listaProyeccionPeriodo = new ArrayList<ProyeccionPeriodoBean>();
			}
		}catch(Exception e){
			System.out.println("Ocurrio un error al listar los montos por periodos " + e.getMessage());
		}
	}
	public void dobleSelect(SelectEvent event) {
		ProyeccionPeriodoBean selected = (ProyeccionPeriodoBean) event.getObject();
		setSelectedProyeccionMontoPeriodo(selected);
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}
	public void seleccionarItem(SelectEvent event) {
		setActivarControl(true);
	}
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}
	public void updateInsertItem() {
		if (tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)) {
			modificarItem();
		}
	}
	public void editItem() {
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}
	public void modificarItem() {
		
		try{
			setSaved("");
			GenericResponse response = mantProyeccionMontoPeriodoService.editarBandaProyeccionMontoPeriodo(ObtenerIdTransaccion(), selectedProyeccionMontoPeriodo);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				System.out.println("Se actualizo Correctamente ");
				setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
			}else{
				System.out.println("No se pudo actualizar ");
				setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			}
			
		}catch(Exception e){
			System.out.println("Error al tratar de actualizar la banda  " + e.getMessage());
		}
	}
	public List<ProyeccionPeriodoBean> getListaProyeccionPeriodo() {
		return listaProyeccionPeriodo;
	}

	public void setListaProyeccionPeriodo(
			List<ProyeccionPeriodoBean> listaProyeccionPeriodo) {
		this.listaProyeccionPeriodo = listaProyeccionPeriodo;
	}

	public ProyeccionPeriodoBean getSelectedProyeccionMontoPeriodo() {
		return selectedProyeccionMontoPeriodo;
	}

	public void setSelectedProyeccionMontoPeriodo(
			ProyeccionPeriodoBean selectedProyeccionMontoPeriodo) {
		this.selectedProyeccionMontoPeriodo = selectedProyeccionMontoPeriodo;
	}

	public Boolean getActivarControl() {
		return activarControl;
	}

	public void setActivarControl(Boolean activarControl) {
		this.activarControl = activarControl;
	}

	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}

	public String getMontoTotal() {
		return montoTotal;
	}

	public void setMontoTotal(String montoTotal) {
		this.montoTotal = montoTotal;
	}

	public String getColorProyeccionAsignado() {
		return colorProyeccionAsignado;
	}

	public void setColorProyeccionAsignado(String colorProyeccionAsignado) {
		this.colorProyeccionAsignado = colorProyeccionAsignado;
	}

}
